【GitHub Actions 小ネタ】プルリクエスト時に差分ファイルの一覧を取得する
GitHub Actionsを使って、 プルリクエスト作成時(もしくは commit push時)に ベースブランチからの差分ファイルを取得したいです。
例えば base:main ← compare:fix
のプルリクエストを作成したとします。 このとき mainブランチとfixブランチの差分ファイル一覧を取得、 差分ファイルに対して Lintを行う、といったことを実現したいです。
以下にそれを実現するワークフローのテンプレート、および活用例を書いてみました。
テンプレート
name: run-actions-using-diff-files on: pull_request: types: [opened, synchronize, reopened] branches: [ main ] paths: [ 'docs/**.md' ] env: base_branch: main diff_path: 'docs/**.md' jobs: run-actions: runs-on: ubuntu-latest steps: - name: Switch to pull request branch uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} - name: Fetch base branch run: git fetch origin ${base_branch}:${base_branch} - name: Run actions using diff_files run: | diff_files=$(git diff --name-only HEAD ${base_branch} -- "${diff_path}" \ | tr "\n" " ") echo "# diff_files: ${diff_files}" #### # ここから先に ${diff_files} を使った処理を記載
on:
にて自動トリガーの設定を pull_request
イベントに絞っています。 branches, paths
を書いてブランチ・ファイルパスでフィルターしています。 このフィルターは用途に合わせて変えてください。
env:
にて環境変数を定義します。 baseブランチ( base_branch
)、および git diff
の範囲 ( diff_path
)を用途に合わせて指定します。
jobs:
にて「差分ファイル一覧を取得する」ところまでを記載しています。
- Switch to pull request branch - actions/checkout を使ってcompareブランチに切り替えています
- Fetch base branch - baseブランチをローカルにコピーしています
- Run actions using diff_files -
git diff
コマンドを使って差分ファイル一覧を取得します。 取得した一覧(${diff_files}
)を使って "何かの処理" を実現します。
活用例(MarkdownファイルのLint)
以下ワークフローは Markdownファイルを textlint を使って 校正する一例です。 docs
ディレクトリ配下のmdファイルに対してチェックを行います。 ※今回はシンプルに 「ら抜き言葉」チェック のみ。
name: run-actions-using-diff-files on: pull_request: types: [opened, synchronize, reopened] branches: [ main ] paths: [ 'docs/**.md' ] env: base_branch: main diff_path: 'docs/**.md' jobs: run-actions: runs-on: ubuntu-latest steps: - name: Switch to pull request branch uses: actions/checkout@v3 with: ref: ${{ github.event.pull_request.head.sha }} - name: Setup node uses: actions/setup-node@v3 with: node-version: 14 - name: Install textlint run: npm install textlint textlint-rule-no-dropping-the-ra - name: Fetch base branch run: git fetch origin ${base_branch}:${base_branch} - name: Run actions using diff_files run: | diff_files=$(git diff --name-only HEAD ${base_branch} -- "${diff_path}" \ | tr "\n" " ") echo "# diff_files: ${diff_files}" #### # ここから先に ${diff_files} を使った処理を記載 npx textlint ${diff_files} --rule textlint-rule-no-dropping-the-ra
実際にプルリクエストを作成して、GitHub Actions を走らせてみます。 以下キャプチャの Run actions using diff_files
ステップから、 差分ファイルの一覧が取得できていることが分かります。
※ちなみに、 textlint (Markdown自動校正) 周りの話は以下ブログに細かく書いています。
おわりに
「プルリクエスト時に差分ファイルの一覧を取得する」GitHub Actionsワークフローを作ってみました。
更新予定のファイルに対してプルリクエスト上で何かチェックをしたいときに役立つと思います。